package com.test.resource;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;

/**
 * 表示文件系统中的资源
 * 主要功能包括获取文件最后修改时间、创建相对资源、检查文件是否存在、是否可读，以及获取文件输入流
 */
public class FileSystemResource implements Resource{
    // 文件路径
    private String path;
    // 文件对象
    private File file;

    /**
     * 构造函数，初始化FileSystemResource对象
     * @param file 文件对象
     */
    public FileSystemResource(File file) {
        this.file = file;
        this.path = file.getPath();
    }

    public FileSystemResource(String path) {
        this.path = path;
        this.file = new File(path);
    }

    /**
     * 获取文件最后修改时间
     * @return 文件最后修改时间，单位为毫秒
     * @throws IOException 如果获取最后修改时间失败
     */
    public long lastModified() throws IOException {
        return Files.getLastModifiedTime(file.toPath()).toMillis();
    }

    /**
     * 创建相对于此资源的新资源
     * @param relativePath 相对路径
     * @return 新的资源对象
     * @throws IllegalArgumentException 如果相对路径为空或无法创建相对路径资源
     */
    public Resource createRelative(String relativePath) {
        if (relativePath == null){
            throw new IllegalArgumentException("相对路径不能为空");
        }

        try{
            Path basePath = file.toPath();
            if (Files.isRegularFile(basePath)){
                basePath = basePath.getParent();
            }

            Path resolvePath = basePath.resolve(relativePath).normalize();
            return new FileSystemResource(resolvePath.toFile());
        }catch (Exception e){
            throw new IllegalArgumentException("无法创建相对路径资源 [" + relativePath + "]", e);
        }
    }

    /**
     * 检查文件是否存在
     * @return 文件存在返回true，否则返回false
     */
    @Override
    public boolean exists() {
        return file.exists();
    }

    /**
     * 检查文件是否可读
     * @return 文件可读返回true，否则返回false
     */
    @Override
    public boolean isReadable() {
        return file.canRead();
    }

    /**
     * 获取文件输入流
     * @return 文件输入流对象
     * @throws IOException 如果无法打开文件
     */
    @Override
    public InputStream getInputStream() throws IOException {
        try{
            return new FileInputStream(file);
        }catch (IOException ex){
            throw new IOException("无法打开文件 [" + path + "]", ex);
        }
    }

    /**
     * 获取资源描述
     * @return 资源描述字符串
     */
    @Override
    public String getDescription() {
        return "文件系统资源 [" + path + "]";
    }

    public String getPath() {
        return path;
    }

    public File getFile() {
        return file;
    }
}
